package cn.tedu.charging.user.service;

import cn.tedu.charging.user.po.UserPO;
import cn.tedu.charging.user.repository.UserRepository;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
@Slf4j
public class WxLoginService {
    @Autowired
    private UserRepository userRepository;
    /** 微信小程序登录charging_bill_exception
     * @param code
     * @param nickname
     * @return
     */
    public Integer doLogin(String code, String nickname) {
        //1.使用微信授权服务器提供的一个接口 发起请求 获取openId
        String openId=getOpenId(code);
        log.info("获取到的openId:{}",openId);
        //2.组织一个userPO对象 使用拿到openId 在用户第一次登录的时候 注册
        //2.1 openId 先查询user表格 如果不存在则注册我们自己的用户 如果存在 则直接查询返回userId
        Integer userId=registerAndGetUserId(openId,nickname);
        return 1;
    }

    private Integer registerAndGetUserId(String openId, String nickname) {
        //使用唯一标识openId 查询user表格 select * from user where wx_open_id=?
        //如果查到就注册过了 ,返回 userId 如果没查到 新增注册 返回userId
        QueryWrapper<UserPO> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("wx_open_id",openId);
        UserPO userPO=userRepository.getOne(queryWrapper);
        if (userPO!=null){
            return userPO.getId();
        }else{
            userPO=new UserPO();
            userPO.setWxOpenId(openId);
            userPO.setNickName(nickname);
            //持久层框架会给po对象自增主键回填属性id
            userRepository.save(userPO);
            return userPO.getId();
        }
    }

    private String getOpenId(String code) {
        //发起一个http请求 到授权服务器
        String url="https://api.weixin.qq.com/sns/jscode2session?" +
                "appId=wx2623426f2a09728c&secret=bb9d265fc7fefacbd15ea689ecc95b72&" +
                "js_code="+code+"&grant_type=authorization_code";
        RestTemplate template=new RestTemplate();
        //发起get请求
        String json=template.getForObject(url,String.class);//获取 反馈的json字符串
        log.info("获取授权结果:{}",json);
        String openId=null;
        //从里面应该拿到 openId字段 openid
        if (json!=null&&json.length()>0){
            //返回值不为空
            JSONObject jsonObject = JSON.parseObject(json);
            openId = (String) jsonObject.get("openid");
        }
        return openId;
    }
}
